<?php
class OAuth2_Controller extends Base_Controller
{
    public function __construct()
    {
        parent::__construct();
        Bundle::start('laravel-oauth2');
    }

    protected function settings($provider)
    {
        $config = Config::get('oauth2.' . $provider);
        if (!$config) {
            throw new Exception('Không tìm thấy cấu hình client cho OAuth2 provider: ' . $provider);
        }
        return $config;
    }

    public function action_session($provider)
    {
        $provider_name = Str::lower($provider);
        $provider = OAuth2::provider(
            $provider, $this->settings($provider)
        );

        if (Input::has('error')) {

            return 'Từ chối truy cập!';

        } elseif (!Input::has('code')) {
            return $provider->authorize();
        } else {
            try {
                $params = $provider->access(Input::get('code'));

                $token = new OAuth2_Token_Access(array('access_token' => $params->access_token));
                $user = $provider->get_user_info($token);

                // Here you should use this information to A) look for a user B) help a new user sign up with existing data.
                // If you store it all in a cookie and redirect to a registration page this is crazy-simple.
                return $this->suf_auth((object)$user, $provider_name);
            } catch (OAuth2_Exception $e) {
                return message_page(array(
                    'content' => "<p>Xảy ra lỗi trong quá trình thực hiện xác thực với {$provider}</p>!",
                    'title' => 'Không thể xác thực',
                ));

                Log::oauth2("Error: " . $e);
            }
        }
    }

    public function action_revoke($provider)
    {
        $this->user_revoke(MyAuth::user()->id, $provider);
        if (Request::ajax()) {
            $link = asset("oauth2/session/{$provider}");
            return Response::json(array(
                'code' => 1,
                'html' => <<<HTML
<i class="icon-ban-circle"></i>
Chưa liên kết
<a href="{$link}" class="spec recommend">
    <i class="icon-random"></i> Kết nối ngay
</a>
HTML

            ));
        } else {
            return message_page(array(
                'content' => "Gỡ bỏ liên kết đến tài khoản {{$provider}} thành công!",
                'redirect_url' => 'user'
            ));
        }
    }

    /**
     * Xử lý sau khi xác thực OAuth2
     * @param $user_info
     * @param $provider
     * @return mixed
     */
    private function suf_auth($user_info, $provider)
    {
        $provider = Str::lower($provider);
        $auth = Authentication::where_provider($provider)->where_uid($user_info->uid)->first();

        if (is_null($auth)) {
            // Kiểm tra người dùng có đang đăng nhập không (nếu có là liên kết tài khoản)
            if (MyAuth::guest()) {
                $user = $this->create_user($user_info, $provider);
                MyAuth::login($user);
            } else {
                $user = MyAuth::user();
            }
            $this->user_link_oauth2($user->id, $provider, $user_info->uid, $user_info->link);
        } else {
            if (MyAuth::guest()) {
                MyAuth::login($auth->user_id);
            } else {
                if ($auth->user_id != MyAuth::user()->id) {
                    $provider = Str::title($provider);
                    return message_page(array(
                        'content' => "Bạn không thể dùng tài khoản <strong>{$provider}</strong> này <br>Tài khoản {$provider} này đã được liên kết với một người dùng khác trong hệ thống!",
                        'title' => 'Đăng nhập',
                        'type' => 'error'
                    ));
                } else {
                    return message_page(array(
                        'content' => "Đăng nhập sử dụng tài khoản <strong>$provider</strong> thành công!",
                        'title' => 'Đăng nhập',
                        'redirect_url' => 'user'
                    ));
                }
            }
        }

        return message_page(array(
            'content' => "Đăng nhập sử dụng tài khoản <strong>$provider</strong> thành công!",
            'title' => 'Đăng nhập',
            'redirect_url' => 'user',
        ));
    }

    private function create_user($user_info)
    {
        if (User::where_username($user_info->nickname)->get() !== null) {
            $user_info->nickname = $user_info->nickname . '_' . time();
        }

        return User::create(array(
            'username' => $user_info->nickname,
            'password' => Hash::make(Str::random(10)),
            'group_id' => MyAuth::USER,
            'display_name' => $user_info->name,
            'email' => $user_info->email,
            'gender' => $user_info->gender == 'male',
        ));
    }

    private function user_link_oauth2($user_id, $provider, $uid, $link)
    {
        $user = User::find($user_id);

        return $user->authentications()->insert(compact('provider', 'uid', 'link'));
    }

    /**
     * Gỡ bỏ tài khoản OAuth2 của một provider gắn với 1 user nào đó
     * @param $user_id
     * @param $provider
     * @return mixed
     */
    private function user_revoke($user_id, $provider)
    {
        return Authentication::where_user_id($user_id)->where_provider($provider)->delete();
    }
}